import aiohttp
from greenlet import greenlet

# #  ---  使用greenlet实现协程
# def gl_func1():
#     print("... 1")
#     gl2.switch()
#     print("... 2")
#     gl2.switch()
#
# def gl_func2():
#     print("... 3")
#     gl1.switch()
#     print("... 4")
#     gl1.switch()
#
# gl1 = greenlet(gl_func1)
# gl2 = greenlet(gl_func2)
#
# gl1.switch()
#
# print("======================================")
# #  ---- 使用 yield 实现协程
# def y_func1():
#     yield 1
#     yield from y_func2()
#     yield 2
#
# def y_func2():
#     yield 3
#     yield 4
#
# y_f1 = y_func1()
#
# for  i in y_f1:
#     print(i)
# #  ----------- 生成器
# #  生成器（Generator）是 Python 中一种按需生成值的特殊对象，它通过 yield 关键字实现惰性计算（Lazy Evaluation），可以高效处理大量数据或无限序列，避免一次性占用全部内存。
# #  核心特点
# #    按需生成 ：生成器不会一次性生成所有数据，而是在每次迭代时动态生成一个值。
# #    内存高效 ：适合处理大规模数据（如日志文件、网络流数据）。
# #    迭代协议 ：生成器本质上是迭代器（实现了 __iter__ 和 __next__ 方法）。
# #  创建生成器的两种方式
# #  1. 生成器函数（使用 yield）
# def count_up_to(n):
#     i = 0
#     while i < n:
#         yield i  # 每次迭代返回 i，并在此暂停
#         i += 1
#
# gen1 = count_up_to(5)
# # print(list(gen1))
# # print(next(gen1))  # 输出 0
# # print(next(gen1))  # 输出 1
# # print(next(gen1))  # 输出 2
#
# # 2.生成器表达式 （类似列表推导，但用 ()）
# gen2 = (x**2 for x in range(5))
# # print(list(gen2))  # 输出 [0, 1, 4, 9, 16]
# print(next(gen2))  # 输出 0
# print(next(gen2))  # 输出 1
# print(next(gen2))  # 输出 4
#
# # 工作流程
# #   1. 调用生成器函数时返回一个生成器对象（不执行函数体）。
# #   2.每次调用 next() 或使用 for 循环时：
# #       2.1 执行到 yield 语句，返回右侧的值。
# #       2.2 暂停执行，保存当前状态（局部变量、指针位置）。
# #       2.3 下次调用 next() 时， 从上次暂停的位置继续执行。
#
# print("======================================")
# ------- 使用asyncio实现协程(python3.4)

#  遇到IO 等耗时操作，自动化切换到tasks中的其他任务
import asyncio

# @asyncio.coroutine
# def ac_func1():
#     print(1)
#     yield from asyncio.sleep(2)  # 遇到I0耗时操作，自动化切换到tasks中的其他任务
#     print(2)
#
# @asyncio.coroutine
# def ac_func2():
#     print(3)
#     yield from asyncio.sleep(2)  # 遇到I0耗时操作，自动化切换到tasks中的其他任务
#     print(4)
#
#
# tasks = [
#     asyncio.ensure_future(ac_func1()),
#     asyncio.ensure_future(ac_func2())
# ]
#
# loop = asyncio.get_event_loop()
# loop.run_until_complete(asyncio.wait(tasks))

# print("======================================")
# ------- 使用 asyncio 的 async 与 await 关键字(python3.5)
# #  @asyncio.coroutine 已过时，请使用 async def
# async def ac_func1():
#     print(1)
#     await asyncio.sleep(2)  # 遇到I0耗时操作，自动化切换到tasks中的其他任务
#     print(2)
#
#
# async def ac_func2():
#     print(3)
#     await asyncio.sleep(2)  # 遇到I0耗时操作，自动化切换到tasks中的其他任务
#     print(4)
#
#
# tasks = [
#     asyncio.ensure_future(ac_func1()),
#     asyncio.ensure_future(ac_func2())
# ]
#
# loop = asyncio.get_event_loop()
# loop.run_until_complete(asyncio.wait(tasks))

# print("======================================")
import requests

# # 1 同步执行
# def download_image_1(url):
#     print("开始下载:", url)
#     # 发送网络请求
#     response = requests.get(url)
#     if response.status_code != 200:
#         print(f"下载失败，状态码：{response.status_code}")
#         return
#     print('下载完成')
#     # 提取文件名（取URL最后一个/后的内容）
#     file_name = url.split('/')[-1]
#     # 保存图片
#     with open(file_name, 'wb') as file_object:
#         file_object.write(response.content)
#
#
# def download_images_1():
#     url_list = [
#         'https://www.autoimg.cn/newsdrafts/gz6/M02/35/A9/1220x0_0_autohomecar_ChsEe12AXQ6A00H_AAFOCM8zN0621.jpg',
#         'https://www.toimg.cn/newsdrafts/gz69/01/35/A9/1220x90_0_autohomecar_ChsEe12AXQ6A00H_AAFOCM8zBICAUntFAADJFDJFd6800429.jpg',
#         'https://www.tooing.cn/newssdfs/gz69/01/31/20x90_0_autohonecar_ChcsV2BBICAuntFAADJFFD6800429.jpg',
#         'https://www.autoing.cn/newsdrafts/gz6/M08/3C/65/120x90_0_autohomecar_ChCP12BFCMAI083AAGq7vK0sGY193.jpg',
#     ]
#     for url in url_list:
#         download_image_1(url)
#
# download_images_1()
#
# # 2 异步执行
# async def download_image_1(session, url):
#     print("发送请求:", url)
#
#     async with session.get(url, verify_ssl=False) as response:  # 修复verify_sssl拼写，改为ssl参数
#         if response.status == 200:
#             content = await response.content.read()  # 修复await语法和读取方式
#             file_name = url.rsplit('_', 1)[-1]  # 修复文件名分割逻辑
#             with open(file_name, 'wb') as f:
#                 f.write(content)
#             print(f"下载完成: {file_name}")
#         else:
#             print(f"请求失败，状态码：{response.status}")
#
# async def downloadImages2():
#     async with aiohttp.ClientSession() as session:  # 修复拼写 aiohp -> aiohttp
#         url_list = [
#             'https://www3.autoimg.cn/newsfs/g26/M02/35/A9/120x90_0_autohomecar_ChsEe12AXQ6A00H_AAFocMs8nzU621.jpg',
#             'https://www2.autoimg.cn/newsdfs/g26/M0B/3C/ME2/01/3C/E2/20x90_0autohomecarCChCSV2BBICAuntFAADjFD6800429.jpg',
#             'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0utohomecarCphC12BFCcmAI083AAqq7vK0sGY193.jpg'
#         ]
#         tasks = [asyncio.create_task(download_image_1(session, url)) for url in url_list]  # 修复create_task拼写
#         await asyncio.gather(*tasks)  # 更推荐使用gather代替wait
# def download_images_2():
#     asyncio.run(downloadImages2())
#
# download_images_2()



# 事件循环
# # 获取 事件循环组
# loop = asyncio.get_event_loop()
# # 把任务放到事件循环组中
# loop.run_until_complete("任务列表")
